#ifndef __STRUCT_NV_H__
#define __STRUCT_NV_H__

/*
    nv_t用来表示一个名字/值节点。 节点连成一串，用来组织像文件夹与文件的数据链表。
        NAMEVALUE_CONTAINER:        类似文件夹
        NAMEVALUE_INSTANCE:        类似文件

        下面的例子中，CONTAINER0包含两个子节点: INSTANCE0和CONTAINER1。 CONTAINER1包含一个子节点: INSTANCE2。
            CONTAINER0 (root)
              INSTANCE0
              CONTAINER1
               INSTANCE2
*/


#define NAMEVALUE_CONTAINER                                                             // 数据链表的节点，表示容器，没有value.
#define NAMEVALUE_INSTANCE                                                              // 数据链表的节点，表示实体, 没有child.

typedef struct nv_t nv_t;

typedef struct nv_t {
    nv_t * parent;                                                                      // parent是容器节点
    nv_t * child;                                                                       // child可能是容器节点或者实体节点
    nv_t * previous;                                                                    // 本节点的前一个节点。 NULL表示本节点是本层的第一个节点
    nv_t * next;                                                                        // 本节点的后一个节点。 NULL表示本节点是本层的最后一个节点
    int    type;                                                                        // NAMEVALUE_CONTAINER/NAMEVALUE_INSTANCE
    char * name;                                                                        // 名称。必须由malloc分配。
    void * value;                                                                       // 数据。必须由malloc分配。
} nv_t;

void nv_free(nv_t *);

#endif